#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

typedef int ElemType;  

typedef struct {
    ElemType *data;  
    int length;      
} List;


int ListLength(List L) {
    return L.length;
}

// 获取线性表中的第i个元素
void GetElem(List L, int i, ElemType *e) {
    if (i < 1 || i > L.length) {
        printf("Error: Invalid position.\n");
        return;
    }
    *e = L.data[i - 1];
}

// 查找线性表中是否存在某元素
int LocateElem(List L, ElemType e, int (*equal)(ElemType, ElemType)) {
    for (int i = 0; i < L.length; i++) {
        if (equal(L.data[i], e)) {
            return 1;  
        }
    }
    return 0;  
}

// 判断两个元素是否相等
int equal(ElemType e1, ElemType e2) {
    return e1 == e2;
}

// 插入元素到线性表
void ListInsert(List *L, int i, ElemType e) {
    if (i < 1 || i > L->length + 1) {
        printf("Error: Insert position is out of range.\n");
        return;
    }
    if (L->length == MAX_SIZE) {
        printf("Error: The list is full.\n");
        return;
    }

    // 移动元素为插入腾出空间
    for (int j = L->length - 1; j >= i - 1; j--) {
        L->data[j + 1] = L->data[j];
    }

    L->data[i - 1] = e;
    L->length++;
}

// 合并两个线性表
void unionList(List *La, List Lb) {
    ElemType e;
    int La_len = ListLength(*La);  
    int Lb_len = ListLength(Lb);   

    // 遍历线性表Lb，将Lb中不在La中的元素插入到La中
    for (int i = 1; i <= Lb_len; i++) {
        GetElem(Lb, i, &e);  
        if (!LocateElem(*La, e, equal)) {  
            ListInsert(La, ++La_len, e);  
        }
    }
}

// 初始化线性表
void InitList(List *L) {
    L->data = (ElemType*)malloc(MAX_SIZE * sizeof(ElemType));  
    L->length = 0;
}

int main() {
    List La, Lb;
    InitList(&La);  
    InitList(&Lb);  

    // 向La中插入元素
    ListInsert(&La, 1, 1);
    ListInsert(&La, 2, 2);
    ListInsert(&La, 3, 3);
    ListInsert(&La, 4, 4);

    // 向Lb中插入元素
    ListInsert(&Lb, 1, 3);
    ListInsert(&Lb, 2, 5);
    ListInsert(&Lb, 3, 6);

    // 打印La和Lb中的元素
    printf("La: ");
    for (int i = 1; i <= La.length; i++) {
        printf("%d ", La.data[i - 1]);
    }
    printf("\n");

    printf("Lb: ");
    for (int i = 1; i <= Lb.length; i++) {
        printf("%d ", Lb.data[i - 1]);
    }
    printf("\n");

    // 合并La和Lb
    unionList(&La, Lb);

    // 打印合并后的La
    printf("La ∪ Lb: ");
    for (int i = 1; i <= La.length; i++) {
        printf("%d ", La.data[i - 1]);
    }
    printf("\n");

    free(La.data);
    free(Lb.data);

    return 0;
}
